package org.sql.connector;

// *************************************************************************/
// Charada Soft
// Area de Desarrollo de Sistemas de Información
// *************************************************************************/
// Proyecto : java connector sql
// Archivo : ServerManager.java
// Descripcion : Clase ServerManager
// *************************************************************************/
// Version : 1.0.5
// Fecha de Creación: 09 de Abril de 2014
// Author : Daniel Andres Castillo Pedroza
// *************************************************************************/

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
import org.sql.connector.interfaces.IAttribsServer;
import org.sql.connector.interfaces.IConnection;

public class ServerManager implements IConnection {

    // Atributos de Conexión de la clase ServerManager
    
    private Connection connection;
    private boolean successConnect = false;
    private int error;

    // Atributos de la clase ServerManager
    
    private IAttribsServer attribsServer;
    private boolean connectServer = false;

    // Constructor de la clase ServerManager
    
    public ServerManager() {}

    public ServerManager(IAttribsServer attribsServer) {
        this.setAttribs(attribsServer);
    }

    // Metodos de la clase ServerManager
    
    /**
     * Este método nos permite obtener la configuración de Atributos establecida
     * para realizar la conexión con el Servidor SQL.
     *
     * @return Retorna la configuración en un objeto <code>IAttribs</code>.
     */
    public IAttribsServer getAttribs() {
        return attribsServer;
    }

    /**
     * Este método establece el objeto que contiene la configuración para
     * realizar conexiónes con un Servidor SQL. Donde la configuración se
     * establece con un objeto <code>IAttribs</code>.
     *
     * @param attribs Configurador de la Conexión con el Servidor SQL
     */
    public final void setAttribs(IAttribsServer attribs) {
        this.attribsServer = attribs;
    }

    /**
     * Este método nos permite conocer el tipo de conexión que se realizara con
     * el Servidor SQL.
     *
     * @return Retorna la respuesta en un dato <code>boolean</code>.
     */
    public boolean isConnectServer() {
        return connectServer;
    }

    /**
     * Este método establece la configuración del tipo de Conexión a ejecutar
     * con el Servidor SQL.
     *
     * @param connectServer Configurador de tipo de Conexión
     */
    public void setConnectServer(boolean connectServer) {
        this.connectServer = connectServer;
    }

    /**
     * Este método nos permite obtener la Ruta de Conexión a establecer con el
     * Servdor SQL ó con una Base de Datos, dependiendo del tipo de configurador
     * de conexión establecido en la Clase.
     *
     * @return Retorna la ruta en un objeto <code>String</code>.
     */
    private String getRootConnection() {
        if (isConnectServer()) {
            return attribsServer.getRootServer();
        } // Conexión directamente con el Servidor SQL
        else {
            return attribsServer.getRootDataBase();
        } // Conexión con una Base de Datos del Servidor SQL
    }

    /**
     * Este método nos permite establecer el resultado de realizar la conexión
     * con el Servidor SQL. Donde el resultado se establece con un dato
     * <code>boolean</code>.
     *
     * @param successConnect Resultado de la conexión
     */
    private void setSuccessConnect(boolean successConnect) {
        this.successConnect = successConnect;
    }

    /**
     * Este método nos permite obtener el Código de Error generado al intentar
     * conectarse con el Servidor SQL o una Base de Datos.
     *
     * @return Retorna el código en un dato <code>int</code>.
     */
    public int getErrorCode() {
        return error;
    }

    // Metodos sobreescritos en la clase ServerManager
    
    @Override
    public void connect() {
        try {
            DriverManager.registerDriver(attribsServer.getDriver());
            Properties property = new Properties();
            property.setProperty("user", attribsServer.getUser());
            property.setProperty("password", attribsServer.getPassword());
            connection = DriverManager.getConnection(getRootConnection(), property);
            setSuccessConnect(true);
        } // Cónexion exitosa con el Servidor SQL // Cónexion exitosa con el Servidor SQL
        catch (SQLException ex) {
            error = ex.getErrorCode(); setSuccessConnect(false);
        } // Ocurrio un error al tratar de conectarse con el Servidor SQL
    }

    @Override
    public void desconnect() throws SQLException {
        connection.close();
    }

    @Override
    public boolean isConnect() {
        return successConnect;
    }

    @Override
    public Connection getConnection() {
        return connection;
    }
}